package com.cn.demand.url;

import com.google.common.hash.Hashing;

import java.nio.charset.Charset;

public class ShortUrl {

    private static final String BASE62_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    public static void main(String[] args) {
        String longUrl = "https://juejin.cn/post/7311894381392232499";
        int hashValue = toHash(longUrl);
        System.out.println(hashValue);

        String base62Number = convertToBase62(hashValue);
        String shortUrl = String.format("hash值：%d  base62:%s",hashValue,base62Number);
        System.out.println(shortUrl);
    }



    /**
     * 通过MurmurHash算法把长链接转换为32bit
     * @param longUrl
     * @return
     */
    public static int toHash(String longUrl){
        int hashValue =  Hashing.murmur3_32().hashString(longUrl, Charset.defaultCharset()).asInt();
        return hashValue;
    }

    /**
     * 10进制转换为62进制
     * Base62编码是由10个数字、26个大写英文字母和26个小写英文字母组成，多用于安全领域和短URL生成。
     * 为了让哈希值表示起来尽可能短，我们可以将通过 MurmurHash得到的 10 进制的哈希值转化成 62 进制
     *
     * @param decimalNumber
     * @return
     */
    public static String convertToBase62(long decimalNumber) {
        StringBuilder sb = new StringBuilder();

        while (decimalNumber > 0) {
            int remainder = (int) (decimalNumber % 62);
            sb.insert(0, BASE62_CHARS.charAt(remainder));
            decimalNumber /= 62;
        }
        return sb.toString();
    }
}
